package main

import "fmt"

// 模板方法模式定义了一个操作中的算法的骨架，而将一些步骤延迟到子类中。
// 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

// AbstractClass 抽象类
type AbstractClass interface {
	PrimitiveOperation1()
	PrimitiveOperation2()
	TemplateMethod()
}

// ConcreteClass 具体类
type ConcreteClass struct{}

func (cc *ConcreteClass) PrimitiveOperation1() {
	fmt.Println("ConcreteClass: PrimitiveOperation1")
}

func (cc *ConcreteClass) PrimitiveOperation2() {
	fmt.Println("ConcreteClass: PrimitiveOperation2")
}

func (cc *ConcreteClass) TemplateMethod() {
	cc.PrimitiveOperation1()
	cc.PrimitiveOperation2()
}

func main() {
	concreteClass := &ConcreteClass{}
	concreteClass.TemplateMethod()
}
